package cn.cnlee.app.remote.interceptor;

import com.google.gson.Gson;

import java.io.IOException;
import java.nio.charset.Charset;

import cn.cnlee.app.config.Constants;
import cn.cnlee.app.config.Urls;
import cn.cnlee.app.pojo.LoginDTO;
import cn.cnlee.app.pojo.LoginVo;
import cn.cnlee.app.remote.ApiService;
import cn.cnlee.app.remote.exception.ServiceException;
import cn.cnlee.app.remote.response.Code;
import cn.cnlee.app.remote.response.ResponseMsg;
import cn.cnlee.arch.event.LiveBus;
import cn.cnlee.arch.http.RemoteClient;
import cn.cnlee.arch.util.Logger;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import okio.BufferedSource;
import retrofit2.Call;

public class AutoLoginInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) {
        // 原始请求
        Request request = chain.request();
        Response response = null;
        try {
            response = chain.proceed(request);
            if (!needCheckLoginStatus(request.url().toString())) {
                return response;
            }
            BufferedSource source = response.body().source();
            source.request(Long.MAX_VALUE);
            String resp = source.getBuffer().clone().readString(Charset.defaultCharset());
            ResponseMsg msg = new Gson().fromJson(resp, ResponseMsg.class);
            // 这里与后台约定的状态码-1表示登录超时【后台是java，客户端自己维护cookie，没有token机制。但此处如果刷新token，方法也一样】
            if (msg != null && msg.getCode() == Code.NEED_LOGIN_CODE) {
                Logger.e("--->登录失效，自动重新登录");
                // TODO 本地获取到之前的user信息
                String sms = "13093282385";
                String password = "123";
                Call<ResponseMsg<LoginDTO>> call = RemoteClient.getInstance().create(ApiService.class).reLogin(new LoginVo());
                ResponseMsg<LoginDTO> responseMsg = call.execute().body();
                if (responseMsg != null && responseMsg.isOk()) {
                    Logger.e("====自动登录成功====" + responseMsg);
                    //通知登录成功
                    LiveBus.get().getChannel(Constants.LOGIN_ACTION_NOTIFY_KEY).postValue(responseMsg.getReturnValue());
                    // TODO 登录成功后，根据需要保存用户信息、会话信息等
                    // 最重要的是将当前请求重新执行一遍!!!
                    response = chain.proceed(request);
                } else {
                    // TODO 扔出需要手动重新登录的异常（BaseSubscriber里处理，此时已经是自动重新登录也不行，如密码在其他终端修改了之类的)
                    Logger.e("--->自动登录失败");
                    throw new ServiceException(Constants.TO_LOGIN_CODE, null);
                }
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return response;
    }

    private boolean needCheckLoginStatus(String url) {
        boolean needCheck = true;
        String method = url.replace(Urls.BASE_URL, "");
        if (Constants.SESSION_NO_CHECK.contains(method)) {
            needCheck = false;
        }
        return needCheck;
    }
}
